/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package op;

import java.util.Calendar;
import java.util.Date;
import java.util.StringTokenizer;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 *
 * @author Jonatas
 */
public class QuebraStringTIM {

    public static Pattern telefoneDDI = Pattern.compile("[0-9]{14}");// (N|R|N/R|AC|AD|VCR|DI|NO|FDS)
    public static Pattern telefone = Pattern.compile("[0-9]{4}-[0-9]{4}");
    public static Pattern telefoneDDD = Pattern.compile("[0-9]{3}-[0-9]{4}-[0-9]{4}");
    public static Pattern hora = Pattern.compile("[0-9]{2}:[0-9]{2}:[0-9]{2}");
    public static Pattern data = Pattern.compile("[0-9]{2}/[0-9]{2}/[0-9]{2}");
    public static Pattern duracao = Pattern.compile("[0-9]{2}m[0-9]{2}s");
    public static Pattern valor = Pattern.compile("[0-9]+[,][0-9]{2}");
    public static Pattern telefoneOutros = Pattern.compile("[0-9]{12}");// (N|R|N/R|AC|AD|VCR|DI|NO|FDS)
    public static Pattern patternTipo = Pattern.compile(" (N|R|N/R|AC|AD|VCR|DI|NO|FDS) ");
    public static Pattern telefoneDiferente = Pattern.compile("[*]?[0-9]{3}");

    public static Date createDate(String data, String hora) {

        Calendar calendar = Calendar.getInstance();
        String[] dia = data.split("/");
        String[] tempo = hora.split(":");

        calendar.set(Integer.parseInt("20" + dia[2]), (Integer.parseInt(dia[1]) - 1), Integer.parseInt(dia[0]),
                Integer.parseInt(tempo[0]), Integer.parseInt(tempo[1]), Integer.parseInt(tempo[2]));

        return calendar.getTime();
    }

    public static EntradaAbstrata quebraStringTIM(String entrada, Telefone origem, String plano) {

        EntradaAbstrata resposta = null;

        entrada = entrada.trim();

        boolean isLigacao = false;

        Telefone destino = null;

        Matcher matchDuracao = duracao.matcher(entrada);

        if (plano.equals("TIM Torpedo")) {
            Matcher matchTorpedo = telefoneOutros.matcher(entrada);

            matchTorpedo.find();

            String numTorpedo = null;
            numTorpedo = matchTorpedo.group();

            destino = new Telefone(numTorpedo);

        }

        if (!matchDuracao.find() && !plano.equals("TIM Torpedo")) { // outras cobrancas

            resposta = new OutrasCobrancas();

            resposta.setDuracaoLigacaoSegundos(null);

            Matcher matcher = telefoneOutros.matcher(entrada);
            if (matcher.find()) {
                String foneStr = null;
                try {
                    foneStr = matcher.group();
                } catch (Exception e) {
                    e.printStackTrace();
                }

                destino = new Telefone(foneStr);
            } else {
                destino = null;
            }

        } else {

            isLigacao = true;
            resposta = new Ligacao();
            String tipo = null;

            String foneStr = null;
            Matcher matcher = null;

            matcher = patternTipo.matcher(entrada);
            boolean find = matcher.find();

            if (find) {
                tipo = matcher.group();
            } else {
                tipo = "";
            }

            if (plano.startsWith("Chamadas de Acesso")) {
                String[] temp = plano.trim().split(" ");
                destino = new Telefone(temp[temp.length - 1].trim());
                matcher = patternTipo.matcher(entrada);
            }

            if (destino == null) {
                matcher = telefoneDDD.matcher(entrada);
                boolean fone = matcher.find();

                if (!fone) {
                    matcher = telefone.matcher(entrada);
                    fone = matcher.find();
                }

                if (fone) {
                    foneStr = null;

                    foneStr = matcher.group();

                } else {

                    matcher = telefoneDDI.matcher(entrada);

                    fone = matcher.find();

                    if (fone) {
                        fone = false;
                        destino = new Telefone(matcher.group().substring(2));
                    } else {

                        matcher = telefoneDiferente.matcher(entrada);

                        fone = matcher.find();

                        if (fone) {
                            fone = false;

                            destino = new Telefone(matcher.group(), true);

                        }
                    }

                }

                //int posFimTelefone = matcher.end();



                if (fone) {

                    String[] partes = foneStr.split("-");
                    if (partes.length == 3) {
                        destino = new Telefone(partes[0], partes[1], partes[2]);
                    } else {
                        destino = new Telefone(partes[0], partes[1]);

                        String inicio = entrada.substring(0, matcher.start());

                        StringTokenizer tokenizer = new StringTokenizer(inicio);

                        String token = "";

                        while (tokenizer.hasMoreTokens()) {
                            token = tokenizer.nextToken();
                        }

                        if (token.length() > 0) {
                            destino.setDdd(token);
                        }

                    }
                }
            }

            String duracaoLigacao = "";

            if (plano.equals("TIM Torpedo")) {
                duracaoLigacao = "00m60s";
            } else {
                duracaoLigacao = matchDuracao.group();
            }

            if (tipo.equals("AC")) {
                resposta.setDuracaoLigacaoACobrarSegundos(getLigacaoSegundos(duracaoLigacao));
            } else {
                resposta.setDuracaoLigacaoSegundos(getLigacaoSegundos(duracaoLigacao));
            }
            resposta.setTipoDeLigacao(tipo);



        }

        if (destino == null) {
            destino = new Telefone("", true);
        }
        //destino
        resposta.setDestino(destino);

        //data e hora
        Matcher matcher = data.matcher(entrada);
        boolean b = matcher.find();
        String date = matcher.group();

        matcher = hora.matcher(entrada);
        b = matcher.find();
        String hour = matcher.group();
        resposta.setDataOrigemLigacao(createDate(date, hour));

        //valor
        matcher = valor.matcher(entrada);
        b = matcher.find();
        Double custo = Double.parseDouble(matcher.group().replace(',', '.'));
        resposta.setCusto(custo);

        if (custo.doubleValue() == 0.0) {
            plano += " franqueada";
        }

        resposta.setPlanoLigacao(plano);
        resposta.setTipoDeLigacao(plano);

        resposta.setNumeroDeOrigem(origem);

        return resposta;
    }

    private static Integer getLigacaoSegundos(String duracao) {

        duracao = "00h" + duracao;

        duracao = duracao.replaceFirst("s", "");

        return EntradaAbstrata.getDuracaoLigacaoSegundos(duracao);

    }

    public static EntradaAbstrata quebraStringTimPlano(String line, Telefone origem, String valor) {

        EntradaAbstrata entrada = new Ligacao();

        entrada.setNumeroDeOrigem(origem);

        String tipo = line.substring(2, line.indexOf(valor)).trim();

        entrada.setDuracaoLigacaoSegundos(60);
        entrada.setDestino(new Telefone("", true));

        entrada.setPlanoLigacao(tipo);
        entrada.setTipoDeLigacao(tipo);

        valor = valor.replace(",", ".");

        double custo = Double.parseDouble(valor);

        entrada.setCusto(custo);

        return entrada;

    }

    public static EntradaAbstrata quebraStringTimOutrosPlanos(String tipo, Telefone origem, String valor) {

        EntradaAbstrata entrada = new Ligacao();

        entrada.setNumeroDeOrigem(origem);

        entrada.setDuracaoLigacaoSegundos(60);
        entrada.setDestino(new Telefone("", true));

        entrada.setPlanoLigacao(tipo);
        entrada.setTipoDeLigacao(tipo);

        valor = valor.replace(",", ".");

        double custo = Double.parseDouble(valor);

        entrada.setCusto(custo);

        return entrada;

    }
}
